"""
@Author  : 康帅
@Time    : 2021/2/22 16:38
@Function: model
"""
from enum import Enum
from pydantic import BaseModel, Field, HttpUrl, EmailStr
from typing import List, Set, Dict


class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"


class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: List[str] = []


class DataModel(BaseModel):
    name: str
    description: str = None
    price: int
    tax: float = None


class ProjectModel(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None


class UserModel(BaseModel):
    username: str
    full_name: str = None


"""Pydantic模型的附加信息"""
# 1、导入Field模块
# from pydantic import BaseModel, Field
# 2、声明模型属性
# 3.添加接口


class Items(BaseModel):
    name: str
    description: str = Field(None, title="The description of the item", max_length=300)
    price: float = Field(..., gt=0, description="The price must be greater than zero")
    tax: float = None


"""Pydantic嵌套模型"""
# 1、模型的属性可以是数据集合类型


class ItemList(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: list = []


class ItemList2(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: List[str] = []


class ItemSet(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: Set[str] = set()


class ItemDict(BaseModel):
    weights: Dict[str, int]


"""每一个Pydantic模型的属性都有一个类型，这个类型也可以是另一个Pydantic模型"""


class Image(BaseModel):
    url: str
    name: str


class ItemNested(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: Set[str] = []
    image: Image = None


"""1.可以把Pydantic模型作为list、set等集合类型的元素类型"""
"""2.模型深层嵌套模型"""


class Images(BaseModel):
    url: HttpUrl
    name: str


class ItemListSet(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: Set[str] = []
    images: List[Images] = None


class Offer(BaseModel):
    name: str
    description: str = None
    price: float
    items: List[ItemListSet]


"""
可以用一些相对复杂的数据类型，并且仍然可以得到以下的功能支持：

编辑器支持
数据格式自动转换
数据格式自动校验
自动生成注解和文档

数据类型:
1、UUID
标准的通用唯一标识符(Universally Unique Identifier)，一般在数据库或者系统中表示ID。
在requests和responses中被认为是字符串类型。
2、datetime.datetime
标准的Python datetime.datetime。
在requests和responses中被认为是字符串类型，例如"2008-09-15T15:53:00+05:00"。
3、datetime.date
标准的Python datetime.date。
在requests和responses中被认为是字符串类型，例如"2008-09-15"。
4、datetime.time
标准的Python datetime.time。
在requests和responses中被认为是字符串类型，例如"14:23:55.003"。
5、datetime.timedelta
标准的Python datetime.timedelta。
在requests和responses中被认为是表示秒数的float类型，例如"2008-09-15"。
6、frozenset
在requests和responses中等同于set。
在requests中，列表数据会先进行去重，然后转换成set。
在responses中，set会被转换成list。
7、bytes
标准的Python bytes。
在requests和responses中被认为是字符串类型。
8、Decimal
标准的Python Decimal。
在requests和responses中被认为是float类型。
"""


class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: str = None


class UserOut(BaseModel):
    username: str
    email: EmailStr
    full_name: str = None


class ResponseItem(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = 10.5
    tags: List[str] = []


class ResponseItemTwo(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = 10.5


class BaseItem(BaseModel):
    description: str
    type: str


class CarItem(BaseItem):
    type = "car"


class PlaneItem(BaseItem):
    type = "plane"
    size: int


class ListItem(BaseModel):
    name: str
    description: str
